home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / utils / console / svgatext.3 / svgatext / SVGATextMode-1.3 / XFREE / common_hw / SC11412.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-29  |  3.5 KB  |  136 lines

  1. /* $XConsortium: SC11412.c,v 1.3 95/01/05 20:41:28 kaleb Exp $ */
  2. /* $XFree86: xc/programs/Xserver/hw/xfree86/common_hw/SC11412.c,v 3.4 1995/07/01 10:49:04 dawes Exp $ */
  3.  
  4. /* Norbert Distler ndistler@physik.tu-muenchen.de  */
  5.  
  6. #include "SC11412.h" 
  7. #include "compiler.h"
  8. #define NO_OSLIB_PROTOTYPES
  9. #include "xf86_OSlib.h"
  10.  
  11. extern int vgaIOBase;
  12. #if NeedFunctionPrototypes
  13. static void wrtSC11412bit(int);
  14. static Bool SetSC11412(unsigned  int, unsigned int, unsigned int, unsigned int);
  15. #else
  16. static void wrtSC11412bit();
  17. static Bool SetSC11412();
  18. #endif
  19.  
  20. Bool
  21. SC11412SetClock(frequency)
  22. register long frequency;
  23. {  
  24. unsigned i;
  25. unsigned  Multiplier, Divider, BigD;
  26. unsigned ErrorTerm=32767;
  27.  
  28. SetSC11412(106,31,0,0);  /* set Mclock to 49 MHz */
  29.  
  30.  
  31.   /* calculate postscalar divider */
  32.   BigD = 0;
  33.   if (frequency < MIN_SC11412_FREQ)
  34.    BigD = 1;
  35.   if (frequency < MIN_SC11412_FREQ / 2)
  36.    BigD = 2;
  37.   if (frequency < MIN_SC11412_FREQ / 4)
  38.     BigD = 3;
  39.   frequency <<= BigD;
  40.  
  41. if (frequency<MIN_SC11412_FREQ)
  42.   return FALSE;     /* Frequency too low! */ 
  43. if (frequency>MAX_SC11412_FREQ)
  44.   return FALSE;    /* Frequency too high! */
  45.  
  46. /* taken from F. Klemms clockprg. */
  47.  
  48. for (i=0; i<125; i++)
  49.       { unsigned long t1=QUARZFREQ*1000*(i+3)/((unsigned long)frequency);
  50.         unsigned long t2=(t1+1000/2)/1000;
  51.         unsigned long t3=t1-t2*1000;
  52.         t2 -= 2;
  53.         t3=(long)t3 > 0 ? t3 : -t3;
  54.         t3=t3*127/(i+3);
  55.         if (t2 > 125)
  56.           continue;
  57.         if (t3 < ErrorTerm)
  58.           ErrorTerm=(unsigned)t3, Multiplier=i, Divider=(unsigned)t2;
  59.       }
  60.         Multiplier+=3; 
  61.         Divider+=2;
  62.  if (Divider == 31)         /* avoid commom denominators of MCLK and PCLK  */
  63.     SetSC11412(107,32,0,0); 
  64.  
  65.  return SetSC11412(Multiplier,Divider,BigD,1);
  66.  
  67. }    /* end of SC11412SetClock */
  68.  
  69.  
  70. static Bool 
  71. #if NeedFunctionPrototypes
  72. SetSC11412(unsigned int N, unsigned int M, unsigned int D, unsigned int Clock)
  73. #else
  74. SetSC11412(N, M, D, Clock)
  75. unsigned int N, M, D, Clock;
  76. #endif
  77. {
  78.     /* N, M, D -> Freq = N/(M*2^D)*QUARZFREQ   C: 1 -> Pclock, 0 -> Mclock selected */
  79.     int vgaCRIndex = vgaIOBase + 4;
  80.     int vgaCRReg = vgaIOBase + 5;
  81.         unsigned int i; 
  82.     if (Clock>1)
  83.       return FALSE; /* ERROR in M/Pclock selection on SC11412 */
  84.  
  85.         outb(0x3C2,0xef); 
  86.     /* reset pointer with rising edge for access to serial interface */
  87.  
  88.     outb(vgaCRIndex,0x42);
  89.     outb(vgaCRReg,0x00);
  90.     outb(vgaCRReg,0x08);
  91.     /* enable programming of SC11412 */
  92.  
  93.         wrtSC11412bit(Clock);          /* select, enable M/Pclock       */
  94.         wrtSC11412bit(0);              /* enable output driver          */
  95.         wrtSC11412bit(0);              /* enable VCO                    */
  96.         wrtSC11412bit(0);              /* external freq. prog. mode     */
  97.         wrtSC11412bit(D&1);
  98.         wrtSC11412bit((D>>1)&1);       /* auxiliary divider    */
  99.         
  100.         for(i=1; i<8; i++)
  101.         {   
  102.                 wrtSC11412bit(N&1);     
  103.                 N>>=1;
  104.         }
  105.         for(i=1; i<8; i++)
  106.         {       
  107.                 wrtSC11412bit(M&1);
  108.                 M>>=1;
  109.         }
  110.     outb(vgaCRReg,0x02); /* End programming of SC11412 */
  111.         return TRUE;         /* successful M/Pclock programmed */
  112. }        
  113.  
  114. static void wrtSC11412bit(bool)
  115. int bool;
  116.    int vgaCRIndex = vgaIOBase + 4;
  117.    int vgaCRReg = vgaIOBase + 5;
  118.    if (bool==1)
  119.    {
  120.     outb(vgaCRReg,0x09);
  121.     usleep(10);
  122.     outb(vgaCRReg,0x0b);
  123.     usleep(10);
  124.    }
  125.    else
  126.    {
  127.     outb(vgaCRReg,0x08);
  128.     usleep(10);
  129.     outb(vgaCRReg,0x0a);
  130.     usleep(10);
  131.    }
  132. }         
  133.  
  134. /* End of SC11412.C */
  135.